<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/11/30
 * Time: 10:26
 */

namespace app\admin\controller;


use app\Model\AdminModel;
use app\Model\AdminRoleModel;
use app\Model\CommentModel;
use app\Model\GoodsModel;
use app\Model\MenuModel;
use app\Model\OrderActionModel;
use app\Model\OrderGoodsModel;
use app\Model\OrderModel;
use app\Model\RegionModel;
use app\Model\ReturnGoods;
use app\Model\ShippingAreaModel;
use app\Model\SpecGoodsPriceModel;
use app\Model\SystemMenuModel;
use app\Model\UserLeverModel;
use app\Model\UsersModel;
use think\Collection;
use think\Controller;
use think\Request;

class Common extends Controller
{

    /*
     * tp5构造函数  判断是否登陆
     */
    public function _initialize()
    {
        
        if (!session('?admin')){
            $this->redirect('Login/login');
        }
        $act= AdminRoleModel::find(session("admin.role_id"));//  $act->act_list;//权限集
        $actList=$act->act_list;//权限集
        $menu =  $this->menu2($actList);//无限目录数组
        $this->assign('menu',$menu);//讲目录数据传入视图显示

        $con= $this->control();
        if ($con){
            $this->redirect('remind',['name'=>$con]);//跳转到提醒界面
        }
        //删除过期订单（超过一天未支付）
        $where=['add_time'=>['<',time()-86400],
                'pay_status'=>0,//未支付
        ];
        $getPast=OrderModel::where($where)->column('order_id');
        if ($getPast){
            OrderModel::destroy($getPast);
        }

     $getWithdrawals= OrderModel::where('order_status',0)//订单信息
            ->order('add_time','desc')->select();
//        dump($getWithdrawals);die();
        $this->assign('orderindex',$getWithdrawals);

        $getReturnGoods = ReturnGoods::where('status','<>',2)->select();//退换货申请
        $this->assign('return_goods2',$getReturnGoods);

        $getcomment=CommentModel::where('reply',0)->where('parent_id',0)->select();//评论信息
        $this->assign('commentreply',$getcomment);
    }

    /*
     * 权限控制管理员操作（判断管理员是否有该功能权限，没有就返回该权限name）
     */
    public function control()
    {
        //1.获取管理员的权限集
        $act= AdminRoleModel::find(session("admin.role_id"));//  $act->act_list;//权限集
        //2.获取当前的功能模块所关联的权限id（通过获取控制器和方法名确定功能模块）
        if ($act->act_list!='all'){//超级管理员无需判断

            $controller= Request::instance()->controller();
            $action = Request::instance()->action();
            $Sys=  SystemMenuModel::where('right','LIKE','%'.$controller.'@'.$action.'%')
                ->where('is_del','=',0)
                ->find();//找到关联权限   // $Sys->id;//权限id
            //3.判断管理员是否有该权限
            if ($Sys){//如果权限限制该功能
                $right=explode(',', $act->act_list);//权限集转数组
                if (!(in_array($Sys->id,$right))){//如果该管理员没有相应权限
                    return $Sys->name;//返回该权限name
//                $this->redirect('remind',['name'=>$Sys->name]);//跳转到提醒界面
                }
            }
        }
    }
    /*
     * 无权限提醒界面
     */
    public function remind($name)
    {
        $data['name']=$name;
        return view('Login/index',$data);
    }
    /*
     * 获取控制器和方法名缓存进menus
     * $menus 对比tp_menu表的menus
     */
    public function getConAndAct($menus='')
    {
        $menu['controller'] = Request::instance()->controller(); // 控制器名
        $menu['action'] = Request::instance()->action();     // 方法名
        $menu['menus']=$menus;
        session('menus',$menu);
    }
    /*
     * 无限目录生成html代码
     */
    public function array_to_Html($arr,$array)
    {
//        $arr=$this->menu2();
        $html='';
        foreach ($arr as $k=>$v){
            $html='';

        };
    }
//{foreach name="menu" key="key" item="value"}
//
//<li class="sidebar-nav-link">
//                <!--有子目录-->
//                {notempty  name="value.menu"}
//                <a href="javascript:;" class="sidebar-nav-sub-title active">
//                    <i class="fa {$value.icon}"></i> {$value.name}
//                    <span class="am-icon-chevron-down am-fr am-margin-right-sm sidebar-nav-sub-ico sidebar-nav-sub-ico-rotate"></span>
//                </a>
//                <ul class="sidebar-nav sidebar-nav-sub" style="display: block;">
//
//                    {foreach name="value.menu" key="k" item="v"}
//
//                    <li class="sidebar-nav-link">
//                        <a href="{:Url('v.controller/v.action')}" class="sub-active">
//                            <span class="am-icon-angle-right sidebar-nav-link-logo"></span> {$v.name}
//                        </a>
//                    </li>
//                    {/foreach}
//                </ul>
//                {else /}
//                    <!--没有子目录-->
//                    <li class="sidebar-nav-link">
//                        <a href="{:Url('value.controller/value.action')}" class="sub-active">
//                            <span class="am-icon-angle-right sidebar-nav-link-logo"></span> {$value.name}
//                        </a>
//                    </li>
//                {/notempty}
//
//
//            </li>
//        {/foreach}

    /*
       * 根据地址反馈经纬度等信息
       */
    public function location2()
    {
        $getData=input();
//        $getData['address']='北京市市辖区北京市详细地址';
        $url="https://apis.map.qq.com/jsapi?qt=poi&wd=".$getData['address'];
//       return retJson(null,0,$getData['address']);die();
        $data = location($url);
        return $data['detail']['pois'];
    }
    /*
     * 目录结构
     * $actList all:超级管理员（无需判断）
     *
     */
    public function menu2($actList)//数据库版
    {
        $where=[];
        if ($actList!='all'){
            $where['system_id']=['in','0,'.$actList];
        }
        $getdata = MenuModel:://所有数据
            where('display','=',0)
            ->where($where)
            ->order('order','asc')
            ->select();

        $array=MenuModel:://根目录数据
            where('display','=',0)
            ->where('follow_id','=','0')
            ->order('order','asc')
            ->select();
        $arr =$this->shu($getdata->toArray(),$array->toArray());//设计树形结构数组
        return $arr;
    }
/*
 * 生成无限树形数组
 * $arr 总数据
 * $array 母目录数据（调用本方法放最大一层目录）
 *        重复调用时填该层的数据
 */
    public function shu($arr,$array)
    {
        $data=$array;
        foreach ($array as $k=>$v){
            $data2=[];
            foreach ($arr as $key=>$value){
                if ($value['follow_id']==$v['id']){//找到子目录（follow_id指向母目录id）
                    array_push($data2,$value);//把目录放入母目录的"menu"下
                    $data2 = $this->shu($arr,$data2);
                    $data[$k]['menu']=$data2;
                }
            }
        }
        //获取
//        $data=$arr;
//        foreach ($arr as $k=>$v){
//            $data2=[];
//            foreach ($arr as $key=>$value){
//                if ($value['follow_id']==$v['id']){
//                    array_push($data2,$value);//把目录放入母目录的"menu"下
//                    $data[$k]['menu']=$data2;
////                    unset($data[$key]);         //去掉子目录原本（位置）的数据
//                }
//            }
//        }
        return $data;
    }
    /*
     * 修改密码页面
     */
    public function setpassv()
    {
        return view('Login/setpassv');
    }
    /*
     * 修改密码
     */
    public function setPass()
    {
        $getData=input('post.');
        //原密码是否正确
       if (session('admin.password')==encryption($getData['password'])) {
           $updata=[
               'admin_id'=>session('admin.admin_id'),
               'password'=>encryption($getData['newpassword2']),
           ];
            $setAdmin=AdminModel::update($updata);

           $this->upSess();
           return setDatabase($setAdmin,'改密');
       }
        setDatabaseDef(false,'原密码错误');

    }

    /*
     * 更新session---管理员
     */
    public function upSess()
    {
        $getAdmin=AdminModel::find(session('admin.admin_id'));
        session('admin',$getAdmin);
    }

    /*
     * 计算物流费
     * $getGoods 商品（商品id，规格，数量）
     * $shipping  物流方式 例：'shentong'
     * 返回物流费
     */
    public function logistics($getGoods,$shipping='shunfeng'){
        $logistics=0;//物流
        $weight=0;//重量
        foreach ($getGoods as $k=>$v){
            $getGoods_data=GoodsModel::find($v['goods_id']);
            if (0==$getGoods_data->is_free_shipping){//1包邮 0不包邮
                $weight+= $getGoods_data->weight*$v['num'];//计算重量
            }
        }
        //物流规则                  //物流名                            //是否默认
       $logConfig= ShippingAreaModel::where(['shipping_code'=>$shipping,'is_default'=>1])->value('config');
        $logConfig=unserialize($logConfig);//反序列化
        // 1000 克以内的 只算个首重费
        if($weight < $logConfig['first_weight'])
        {
            return $logConfig['money'];
        }
        // 超过 1000 克的计算方法

        $weight = $weight - $logConfig['first_weight']; // 续重
        $weight = ceil($weight / $logConfig['second_weight']); // 续重不够取整
        $freight = $logConfig['money'] +  $weight * $logConfig['add_money']; // 首重 + 续重 * 续重费
        return $freight;
    }

    /**
     * @param string $method  方法名
     * @param string $page    页面
     * 数据验证
     */
    function veri($method='',$page=''){
        $validate = validate($method);
        $validate->scene($page);
        if(!$validate->check(input('post.'))){
            $this->error($validate->getError());
        }
    }

    /*
     * 根据订单id返回订单内商品信息
     * $orderId 订单id
     */
    public function goods($orderId='')
    {
       $getGoods= OrderGoodsModel::where('order_id','=',$orderId)->select();
       return $getGoods;
    }
    /*
     * 订单操作
     *  $order 该订单（obj）
     *  $status_code 要改变的状态字段（order_status 订单，shipping_status 发货，pay_status 支付）
     * $status_val 要改变的状态值（0,1,2）
     * $action 操作描述
     * $note 操作备注
     */
    public function setOrderC($order,$status_code='',$status_val,$action='',$note='')
    {
        $update=[//字段               值
                $status_code=>$status_val
        ];
        if ($status_code=='order_status'&&$status_val=='5'){//报废订单
            if ($order->order_status!=3||$order->order_status!=5){
                retJson('',201,'只有已取消或已完成的订单可以作废')->send();
                exit();
            }
        }
        $setOrder = OrderModel::where('order_id','=',$order->order_id)->update($update);
//        return setDatabase($setOrder);
        setDatabaseDef($setOrder,$action.'失败');
        $this->orderActionLog($order->order_id,$action,$note);//添加订单操作记录
    }

    /*
     * 订单操作记录
     * $order_id 该订单id
     * $action 操作描述
     * $note 操作备注
     */
    public function orderActionLog($order_id,$action='',$note='')
    {


        $order = OrderModel::find($order_id);
        $data['order_id'] = $order->order_id;
        $data['action_user'] = session('admin')->admin_id;
        $data['action_note'] = $note;
        $data['order_status'] = $order['order_status'];
        $data['pay_status'] = $order['pay_status'];
        $data['shipping_status'] = $order['shipping_status'];
        $data['log_time'] = time();
        $data['status_desc'] = $action;
        $orderActionLog = OrderActionModel::insert($data);
        setDatabaseDef($orderActionLog,$action.'失败');
    }
/*
 * 文件上传
 */
    public function upload_files($file)
    {
//        $file = request()->file('whiteList');
        $site=ROOT_PATH . 'public' . DS . 'upload' . DS . 'goods';
        chmod($site,0777);

        $info = $file->validate(['size'=>2097152,'ext'=>'jpg,jpeg,png'])->move($site);
        if (!$info){
            retJson('',201,'图片过大，请上传小于2M的图片')->send();
            exit();
        }
        if($info){
            $exclePath = $info->getSaveName();  //获取文件名
            $file_name =ROOT_PATH . 'public' . DS . 'upload' . DS . 'goods'. $exclePath;   //上传文件的地址

//            unset($info);//释放变量
//            chmod($file_name,0777);  //修改权限
//            unlink($file_name);
            $exclePath=  str_replace('\\','/',$exclePath);
            $exclePath='/upload/goods/'.$exclePath;
            return $exclePath;
        }else{
            // 上传失败获取错误信息
            return false;
        }

//       dump($_FILES['whiteList']);die();
    }

  /*
   * 文件删除
   * $fileurl文件路径/文件名例（/upload/goods/20181222/2f27a773dbfe25110d9e07ca2070c93b.jpg）
   */
    public function del_file($fileurl)
    {
        if ($fileurl==''){
            return false;
        }
        $fileurl='.'.$fileurl;

        if (file_exists($fileurl)){//该文件存在

            chmod($fileurl,0777);
            unlink($fileurl);//删除文件
//            return $fileurl.'文件存在';
        };
//        retJson('',201,'文件不存在')->send();
//        exit();
//        return $fileurl.'文件不存在';
    }
    /*
     * 根据会员id会员等级信息
     * $order_id 订单id
     */
    public function user_data($user_id)
    {
        $user_data=UsersModel::find($user_id);
        $user_leve=$this->user_leve($user_data->level);
        return $user_leve;
    }
    /*
     * 会员等级信息
     * $level_id 会员等级id
     */
    public function user_leve($level_id)
    {

        $data=UserLeverModel::find($level_id);
        return $data;
    }
    /*
     * 商品列表（包含不同规格）
     */
    public function goodsEndSpec()
    {
        //商品列表
        $data['goods'] = GoodsModel::column('*','goods_id');
        //规格表
        $data['spec']=SpecGoodsPriceModel::select();

        foreach ($data['spec'] as $k => $v) {
            if (empty($data['goods'][$v->goods_id]['spec'])){
                $data['goods'][$v->goods_id]['spec']=[];
            }
            array_push($data['goods'][$v->goods_id]['spec'],$v->toArray());
        }
        return  $data['goods'];
    }
   /*
    * 订单所包含的商品信息详情
    * $order_data 订单包含的商品数组[goods_id=>商品id，key=>商品规格，num=>数量]
    */
    public function order_goods_data($order_data=[])
    {
        foreach ($order_data as $k=>$v){
            $where=['goods_id'=>$order_data['goods_id']];
            //商品图片路径
            $moneyq= GoodsModel::where($where)->find();//默认商品信息()
            $data[$k]['original_img']=$moneyq->original_img;
            //判断该商品是否有规格
            if ($order_data['spec_key']==''){//没有规格
                $data[$k]['market_price']=$moneyq->market_price;//市场价
                $data[$k]['shop_price']=$moneyq->shop_price;//本店价
            }else{//有规格
                $moneyq=SpecGoodsPriceModel::where($where)->where('key',$v->spec_key)->find();//有规格替换规格信息
                $data[$k]['market_price']=$moneyq->price_tall;//市场价
                $data[$k]['shop_price']=$moneyq->price;//本店价
            }
            $data[$k]['store_count']=$moneyq->store_count;//库存
        }
        return $data;
    }
    /*
     * 三级联动
     * 根据传过来的父id和等级level打印子数据（市、县）
     */
    public function getRegion()
    {
        $postData=input('post.');
        $where=[
            'parent_id'=>$postData['parent_id'],//父id
            'level'=>$postData['level']//地区等级-》省市县区
        ];
        $getRegio= RegionModel::where($where)->select();
        $html='';
        if($getRegio){
            foreach($getRegio as $h){
                if($h['id'] == $postData['parent_id']){
                    $html .= "<option value='{$h['id']}' selected>{$h['name']}</option>";
                }
                $html .= "<option value='{$h['id']}'>{$h['name']}</option>";
            }
        }

        echo $html;

    }
}